package cn.kgc.controller;

import cn.kgc.dto.Dto;
import cn.kgc.service.OrderService;
import cn.kgc.utils.Constants;
import cn.kgc.vo.CreateOrderVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageDeliveryMode;
import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/api/v")
@Slf4j
public class OrderController {


    @Autowired
    OrderService orderService;


    @Autowired
    RabbitTemplate rabbitTemplate;

    @RequestMapping("/createOrder")
    public Dto createOrder(@RequestBody  CreateOrderVo createOrderVo) throws Exception {
        return orderService.createOrder(createOrderVo);
    }


    //方法1.写个定时任务，扫描订单库中，超时未支付的订单，并且订单状态改成取消状态，座位重新释放
    //10:10分的时候执行了一次查找超时订单，而第10：11分钟用户执行生成了一个订单（按道理来讲订单10：41份时候超时）
    //由于周期10分钟执行一次，
    // 10:10，10:20,10:30，10:40，需要到10:50分的时候才会把上面的订单超时释放，座位也是10:50分的时候超时释放，这个订单存活了39分？
    //解决办法：
    //1.后台容忍这个问题，前端时钟，前端做的，cookies,前端js倒数，容忍这个问题。redis里面设置30分钟过期时间，查询redis查，30分钟后
    //2.后台定时任务10分钟，2分钟,1分钟
    //最终一致性
    @Scheduled(cron = "0 0/1 * * * ?")
    public void flushCancelOrder(){
        log.info("定时任务执行："+ System.currentTimeMillis());
        //每10分钟看一下数据库有没有超时未支付的订单，订单需要取消支付，座位释放
        orderService.fluashCancelOrder();
    }



    //方法2.可以使用RabbitMq的延迟队列，对超时未支付的订单做订单状态改成取消状态，座位重新释放 todo
    @RequestMapping("/sendOrderNo")
    public String sendOrderNo(){
        rabbitTemplate.convertAndSend(Constants.RabbitQueueName.TOPIC_EXCHANGE, Constants.RabbitQueueName.TO_WAIT_OVERTIME_QUEQUE, "2018062505533679fe3f", new MessagePostProcessor() {
            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
                message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
                return message;
            }
        });
        return "success";
    }







}
